Criminaliteit en Welvaart#
Student names: Chris Dukker, David Snoeks, Ryan Rodrigus, Jason Roes
Team number: D2
Show code cell source
# Load image from link
url = 'https://ccv-secondant.nl/fileadmin/w/secondant_nl/platform/illustraties/Internationaal.jpg'
# Display image from URL with smaller size and subtitle
from IPython.display import Image, display
# Set the desired image width and height
width = 600
height = 300
# Set the subtitle text
subtitle = "© CCV / Hans Sprangers"
# Create an Image instance with the URL
image = Image(url=url, width=width, height=height)
# Display the image and subtitle
display(image)
print(subtitle)

© CCV / Hans Sprangers
Introduction#
In Europa is er een verschil in welvaart tussen landen. Zo zijn er sommige landen met meer gelijkheid en landen die meer totaal inkomen hebben. Maar er is ook een verschil in criminaliteit. Sommige landen hebben meer totale criminaliteit en in sommige landen gebeuren bepaalde misdaden meer dan anderen. De vraag is alleen of er ook een verband is tussen hoe welvarend een land is en hoeveel misdaden en ook welke misdaden er gebeuren.
Met deze data story gaan we onderzoeken of ongelijkheid en het gemiddelde inkomen per persoon invloed heeft op de hoeveelheid misdaden die er gebeuren, en of het invloed heeft op specifieke misdaden als moord, verkrachting, diefstal, fraude en drugsgebruik. Dit doen we met behulp van de GINI (een maatstaf voor inkomens- of vermogenongelijkheid) en de economie en groei dataset van World Bank Open Data en de misdaadstatistieken dataset van de Europese Commissie.
Volgens De Courson & Nettle (2021) is voor mensen met een laag inkomen en kapitaal het soms de optimale strategie om misdaden te plegen, voornamelijk misdaden waarmee geld valt te verdienen. Hoewel er het risico is om gepakt te worden, is wat ze krijgen als ze niet gepakt worden het heel erg waard. Ook omdat ze niet veel hoop voor de rest hebben en ook niet veel te verliezen hebben, voelen ze dat dat hun beste kans is om uit hun huidige leven te ontsnappen.
Dataset and Preprocessing#
Zie het bestand preprocess.ipynb
Your First Perspective#
Verband diefstal, fraude en ongelijkheid#
Fraude en diefstal hebben veel met elkaar te maken: ze gaan namelijk allebei over het stelen van geld van iemand anders.
At solmen va esser necessi far uniform grammatica, pronunciation e plu sommun paroles. Ma quande lingues coalesce, li grammatica del resultant lingue es plu simplic e regulari quam ti del coalescent lingues. Li nov lingua franca va esser plu simplic e regulari quam li existent Europan lingues. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante.
Show code cell source
import plotly.graph_objects as go
import pandas as pd
# Read the data from table2.csv
df2 = pd.read_csv('table2.csv')
# Initialize a figure
fig2 = go.Figure()
# Create the first line
fig2.add_trace(
go.Scatter(
x=df2["Jaartal"],
y=df2["Workers involved (x 1,000)"],
mode='lines+markers',
line=dict(color='#00a1cd', width=2),
marker=dict(color='#00a1cd', size=5),
name="Workers involved",
hovertemplate='<b>%{x}</b><br>Workers involved: <b>%{y} thousand</b> <extra></extra>'
)
)
# Create the second line
fig2.add_trace(
go.Scatter(
x=df2["Jaartal"],
y=df2["Working days lost (x 1,000)"],
mode='lines+markers',
line=dict(color='#0058b8', width=2),
marker=dict(color='#0058b8', size=5),
name="Working days lost",
hovertemplate='<b>%{x}</b><br>Working days lost: <b>%{y} thousand</b> <extra></extra>'
)
)
# Customize the plot layout
fig2.update_layout(
plot_bgcolor='white',
xaxis=dict(title='Years'),
yaxis=dict(title=''), # Remove y-axis tick labels
legend=dict(title='', orientation='h', yanchor='bottom', y=-0.3, xanchor='right', x=0.3), # Update legend settings
title="Number of workers involved and working<br>days lost during strikes (in thousand)",
height=500
)
# Add horizontal lines at y = 0, 100, 200, 300, 400, and 500
y_values = [0, 100, 200, 300, 400, 500]
for y in y_values:
fig2.add_shape(
type='line',
x0=min(df2['Jaartal']),
x1=max(df2['Jaartal']),
y0=y,
y1=y,
line=dict(color='black'),
line_width=0.5
)
# Show the plot
fig2.show()
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
Cell In[2], line 5
2 import pandas as pd
4 # Read the data from table2.csv
----> 5 df2 = pd.read_csv('table2.csv')
7 # Initialize a figure
8 fig2 = go.Figure()
File ~/miniconda3/lib/python3.13/site-packages/pandas/io/parsers/readers.py:1026, in read_csv(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)
1013 kwds_defaults = _refine_defaults_read(
1014 dialect,
1015 delimiter,
(...) 1022 dtype_backend=dtype_backend,
1023 )
1024 kwds.update(kwds_defaults)
-> 1026 return _read(filepath_or_buffer, kwds)
File ~/miniconda3/lib/python3.13/site-packages/pandas/io/parsers/readers.py:620, in _read(filepath_or_buffer, kwds)
617 _validate_names(kwds.get("names", None))
619 # Create the parser.
--> 620 parser = TextFileReader(filepath_or_buffer, **kwds)
622 if chunksize or iterator:
623 return parser
File ~/miniconda3/lib/python3.13/site-packages/pandas/io/parsers/readers.py:1620, in TextFileReader.__init__(self, f, engine, **kwds)
1617 self.options["has_index_names"] = kwds["has_index_names"]
1619 self.handles: IOHandles | None = None
-> 1620 self._engine = self._make_engine(f, self.engine)
File ~/miniconda3/lib/python3.13/site-packages/pandas/io/parsers/readers.py:1880, in TextFileReader._make_engine(self, f, engine)
1878 if "b" not in mode:
1879 mode += "b"
-> 1880 self.handles = get_handle(
1881 f,
1882 mode,
1883 encoding=self.options.get("encoding", None),
1884 compression=self.options.get("compression", None),
1885 memory_map=self.options.get("memory_map", False),
1886 is_text=is_text,
1887 errors=self.options.get("encoding_errors", "strict"),
1888 storage_options=self.options.get("storage_options", None),
1889 )
1890 assert self.handles is not None
1891 f = self.handles.handle
File ~/miniconda3/lib/python3.13/site-packages/pandas/io/common.py:873, in get_handle(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)
868 elif isinstance(handle, str):
869 # Check whether the filename is to be opened in binary mode.
870 # Binary mode does not support 'encoding' and 'newline'.
871 if ioargs.encoding and "b" not in ioargs.mode:
872 # Encoding
--> 873 handle = open(
874 handle,
875 ioargs.mode,
876 encoding=ioargs.encoding,
877 errors=errors,
878 newline="",
879 )
880 else:
881 # Binary mode
882 handle = open(handle, ioargs.mode)
FileNotFoundError: [Errno 2] No such file or directory: 'table2.csv'
Figure 2: Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.
Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante.
The Second Argument of Your First Perspective#
It va esser tam simplic quam Occidental in fact, it va esser Occidental. A un Angleso it va semblar un simplificat Angles, quam un skeptic Cambridge amico dit me que Occidental es. Li Europan lingues es membres del sam familie. Lor separat existentie es un myth. Por scientie, musica, sport etc, litot Europa usa li sam vocabular. Li lingues differe solmen in li grammatica, li pronunciation e li plu commun vocabules. Omnicos directe al desirabilite de un nov lingua franca: On refusa continuar payar custosi traductores. At solmen va esser necessi far uniform grammatica, pronunciation e plu sommun paroles.
Show code cell source
import plotly.graph_objects as go
import pandas as pd
# Read the data from table3.csv
df3 = pd.read_csv('table3.csv')
# Create an empty figure
fig3 = go.Figure()
# Define a list of tuples with the variable names and their respective colors
variables = [("Collective agreement (CAO) (% (very) satisfied)", '#00a1cd'),
("Salary (% (very) satisfied)", '#0058b8')]
# Loop over the variables to add a trace for each one
for var, color in variables:
name = var.split("(")[0].strip()
fig3.add_trace(go.Bar(
y=df3["Bedrijfstak"],
x=df3[var],
name=name,
orientation='h',
hovertemplate=f'%{{y}}<br>{name}: <b>%{{x}}% (very) satisfied</b><extra></extra>',
marker_color=color
))
# Customize the plot layout
fig3.update_layout(
plot_bgcolor='white',
title="Percentage of employees satisfied with<br>collective agreement and salary (15-74 yrs), 2022",
xaxis=dict(title='', title_standoff=10, automargin=True, range=[0, 100]), # Hide the original x-axis title
yaxis=dict(title='', autorange="reversed", automargin=True), # Remove y-axis title and add more whitespace between items
legend=dict(title='', orientation='h', yanchor='bottom', y=-0.3, xanchor='right', x=0.04), # Update legend settings
barmode='group', # Stack bars instead of placing them side-by-side
height=600,
annotations=[dict(x=1.015, y=-0.15, xref='paper', yref='paper', showarrow=False, text="(%) very satisfied")] # Add annotation as x-axis title
)
# Show the plot
fig3.show()
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
Cell In[1], line 5
2 import pandas as pd
4 # Read the data from table3.csv
----> 5 df3 = pd.read_csv('table3.csv')
7 # Create an empty figure
8 fig3 = go.Figure()
File ~/miniconda3/lib/python3.13/site-packages/pandas/io/parsers/readers.py:1026, in read_csv(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)
1013 kwds_defaults = _refine_defaults_read(
1014 dialect,
1015 delimiter,
(...) 1022 dtype_backend=dtype_backend,
1023 )
1024 kwds.update(kwds_defaults)
-> 1026 return _read(filepath_or_buffer, kwds)
File ~/miniconda3/lib/python3.13/site-packages/pandas/io/parsers/readers.py:620, in _read(filepath_or_buffer, kwds)
617 _validate_names(kwds.get("names", None))
619 # Create the parser.
--> 620 parser = TextFileReader(filepath_or_buffer, **kwds)
622 if chunksize or iterator:
623 return parser
File ~/miniconda3/lib/python3.13/site-packages/pandas/io/parsers/readers.py:1620, in TextFileReader.__init__(self, f, engine, **kwds)
1617 self.options["has_index_names"] = kwds["has_index_names"]
1619 self.handles: IOHandles | None = None
-> 1620 self._engine = self._make_engine(f, self.engine)
File ~/miniconda3/lib/python3.13/site-packages/pandas/io/parsers/readers.py:1880, in TextFileReader._make_engine(self, f, engine)
1878 if "b" not in mode:
1879 mode += "b"
-> 1880 self.handles = get_handle(
1881 f,
1882 mode,
1883 encoding=self.options.get("encoding", None),
1884 compression=self.options.get("compression", None),
1885 memory_map=self.options.get("memory_map", False),
1886 is_text=is_text,
1887 errors=self.options.get("encoding_errors", "strict"),
1888 storage_options=self.options.get("storage_options", None),
1889 )
1890 assert self.handles is not None
1891 f = self.handles.handle
File ~/miniconda3/lib/python3.13/site-packages/pandas/io/common.py:873, in get_handle(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)
868 elif isinstance(handle, str):
869 # Check whether the filename is to be opened in binary mode.
870 # Binary mode does not support 'encoding' and 'newline'.
871 if ioargs.encoding and "b" not in ioargs.mode:
872 # Encoding
--> 873 handle = open(
874 handle,
875 ioargs.mode,
876 encoding=ioargs.encoding,
877 errors=errors,
878 newline="",
879 )
880 else:
881 # Binary mode
882 handle = open(handle, ioargs.mode)
FileNotFoundError: [Errno 2] No such file or directory: 'table3.csv'
Figure 3: Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.
Li Europan lingues es membres del sam familie. Lor separat existentie es un myth. Por scientie, musica, sport etc, litot Europa usa li sam vocabular. Li lingues differe solmen in li grammatica, li pronunciation e li plu commun vocabules. Omnicos directe al desirabilite de un nov lingua franca: On refusa continuar payar custosi traductores.
Your Second Perspective#
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.
The First Argument of Your Second Perspective#
Ongelijkheid en diefstal hebben niet veel met elkaar te maken in Europa en nijgt eerder naar dat landen met een lagere GINI (meer gelijkheid) meer diefstal hebben.
Show code cell source
import pandas as pd
import plotly.express as px
import plotly.io as pio
pio.renderers.default = 'notebook'
# Load datasets
gini_df = pd.read_csv("gini_definitive.csv")
crime_df = pd.read_csv("europe_crime_definitive_per_100k.csv")
# Merge datasets on 'Country' and 'Year'
merged_df = pd.merge(crime_df, gini_df, on=["Country Name", "Year"])
merged_df = merged_df.rename(columns={"Value": "GINI"})
# Reshape crime data: convert Fraud and Theft columns into rows
long_df = merged_df.melt(
id_vars=["Country Name", "Year", "GINI"],
value_vars=['Theft'],
var_name="CrimeType",
value_name="Aantal Misdaden"
)
# Create scatter plot
fig = px.scatter(
long_df,
x="Aantal Misdaden",
y="GINI",
color="CrimeType",
hover_data=["Country Name", "Year"],
title="GINI vs. Number of Crimes (Fraud and Theft)"
)
fig.show()
Figure 4: Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.
In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.
Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?
The Second Argument of Your Second Perspective#
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
Show code cell source
import pandas as pd
import plotly.express as px
import plotly.io as pio
pio.renderers.default = 'notebook'
# Load datasets
bank1_df = pd.read_csv("world_bank_definitive.csv")
bank_df = bank1_df[bank1_df['Indicator Name'] == "GDP per capita, PPP (constant 2021 international $)"]
crime1_df = pd.read_csv("europe_crime_definitive_per_100k.csv")
# Merge datasets on 'Country' and 'Year'
merged_df = pd.merge(crime_df, bank_df, on=["Country Name", "Year"])
merged_df = merged_df.rename(columns={"Value": "GDP per capita, PPP (constant 2021 international $)"})
# Reshape crime data: convert Fraud and Theft columns into rows
long_df = merged_df.melt(
id_vars=["Country Name", "Year", "GDP per capita, PPP (constant 2021 international $)"],
value_vars=['Burglary'],
var_name="CrimeType",
value_name="Aantal Misdaden"
)
# Create scatter plot
fig = px.scatter(
merged_df,
x="Burglary",
y="GDP per capita, PPP (constant 2021 international $)",
color="Burglary",
hover_data=["Country Name", "Year"],
title="GDP vs. Number of Crimes (Fraud and Theft)"
)
fig.show()
Figure 5: Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.
In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.
Show code cell source
import geopandas as gpd
import pandas as pd
import plotly.express as px
import random
# Read the shapefile using geopandas
shapefile_path = 'gadm41_NLD_shp/gadm41_NLD_1.shp'
data = gpd.read_file(shapefile_path)
# Sample data for demonstration
sample_data = {
'Province': ['Drenthe', 'Flevoland', 'Fryslân', 'Gelderland', 'Groningen', 'Limburg', 'Noord-Brabant', 'Noord-Holland', 'Overijssel', 'Utrecht', 'Zeeland', 'NA'],
'average_income': [random.randint(0, 1000000) for _ in range(12)]
}
# Merge the sample data with the shapefile data
merged_data = data.merge(pd.DataFrame(sample_data), left_on='NAME_1', right_on='Province')
# Exclude Zeeuwse meren and IJsselmeer regions
merged_data = merged_data[~merged_data['NAME_1'].isin(['Zeeuwse meren', 'IJsselmeer'])]
# Rename Fryslân to Friesland
merged_data.loc[merged_data['NAME_1'] == 'Fryslân', 'NAME_1'] = 'Friesland'
# Rename Noord-Brabant to Brabant
merged_data.loc[merged_data['NAME_1'] == 'Noord-Brabant', 'NAME_1'] = 'Brabant'
# Rename NA to Zuid-Holland
merged_data.loc[merged_data['NAME_1'] == 'NA', 'NAME_1'] = 'Zuid-Holland'
# Create the choropleth map using Plotly Express
fig6 = px.choropleth_mapbox(
merged_data,
geojson=merged_data.geometry.__geo_interface__,
color='average_income',
locations=merged_data.index,
featureidkey="id",
center={"lat": 52.1326, "lon": 5.2913},
mapbox_style="carto-positron",
zoom=5.5,
color_continuous_scale='Blues',
labels={'average_income': 'Average income'},
opacity=0.75,
hover_name='NAME_1', # Update to 'NAME_1' for correct hover labels
hover_data={'average_income': True, 'NAME_1': False}, # Update to 'NAME_1' for correct hover data
custom_data=['average_income'],
)
fig6.update_traces(
hovertemplate='<b>%{hovertext}</b><br>Average income: <b>%{customdata[0]}k</b><extra></extra>',
)
fig6.update_layout(
title_text='Average income by Province in the Netherlands',
margin={"r": 30, "t": 70, "l": 30, "b": 30},
legend=dict(
traceorder='normal',
font=dict(size=10),
bgcolor='rgba(255, 255, 255, 0.5)',
bordercolor='rgba(0, 0, 0, 0.5)',
borderwidth=0.5
),
hoverlabel=dict(
bgcolor='white',
font_size=12,
font_family='Arial',
),
height=600
)
fig6.show()
Figure 6: Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.
Reflection#
Curabitur non lacus ex. Maecenas at massa ultricies justo venenatis condimentum sed et eros. Ut vitae iaculis massa. Aenean vitae sagittis nibh. Aliquam pharetra dui suscipit purus dictum rutrum. Donec ultricies odio quis porttitor aliquet. Fusce sed nisl non velit rutrum commodo nec sed magna. Morbi non volutpat mi, cursus pulvinar dolor.
Nam sit amet volutpat sapien. Aenean eu mattis neque. Maecenas eget libero consequat, condimentum nulla luctus, fermentum lectus. Donec at enim sit amet dolor vestibulum faucibus. Vestibulum velit elit, faucibus ut mi sit amet, mollis rutrum eros. Ut ut lacinia ante, eu placerat ligula. Fusce quis convallis purus. Maecenas eget fringilla quam.
Proin ac sapien et lectus tempor dignissim a at arcu. Donec placerat aliquet odio, vel aliquam nibh tempus vel. Pellentesque non velit iaculis, porta metus sed, dictum augue. Aenean tempus gravida ullamcorper. Proin cursus fringilla turpis. Integer id lectus dignissim, ultrices metus vel, dictum quam. Suspendisse augue ligula, vestibulum ac nulla a, porta pharetra leo. Integer et pharetra lacus, in porttitor mauris. Cras sodales metus sit amet enim rhoncus sodales. Etiam orci enim, tincidunt eget arcu vel, gravida scelerisque lacus.
Work Distribution#
Curabitur non lacus ex. Maecenas at massa ultricies justo venenatis condimentum sed et eros. Ut vitae iaculis massa. Aenean vitae sagittis nibh. Aliquam pharetra dui suscipit purus dictum rutrum. Donec ultricies odio quis porttitor aliquet. Fusce sed nisl non velit rutrum commodo nec sed magna. Morbi non volutpat mi, cursus pulvinar dolor.
Nam sit amet volutpat sapien. Aenean eu mattis neque. Maecenas eget libero consequat, condimentum nulla luctus, fermentum lectus. Donec at enim sit amet dolor vestibulum faucibus. Vestibulum velit elit, faucibus ut mi sit amet, mollis rutrum eros. Ut ut lacinia ante, eu placerat ligula. Fusce quis convallis purus. Maecenas eget fringilla quam.
Proin ac sapien et lectus tempor dignissim a at arcu. Donec placerat aliquet odio, vel aliquam nibh tempus vel. Pellentesque non velit iaculis, porta metus sed, dictum augue. Aenean tempus gravida ullamcorper. Proin cursus fringilla turpis. Integer id lectus dignissim, ultrices metus vel, dictum quam. Suspendisse augue ligula, vestibulum ac nulla a, porta pharetra leo. Integer et pharetra lacus, in porttitor mauris. Cras sodales metus sit amet enim rhoncus sodales. Etiam orci enim, tincidunt eget arcu vel, gravida scelerisque lacus.
References#
De Courson, B., Nettle, D. Why do inequality and deprivation produce high crime and low trust?. Sci Rep 11, 1937 (2021). https://doi.org/10.1038/s41598-020-80897-8